//
// Created by mio on 25-4-11.
//

#ifndef EPOLLTASKSCHEDULER_H
#define EPOLLTASKSCHEDULER_H

#include <unordered_map>

#include "TaskScheduler.h"

/**
 * @brief 使用 Linux epoll 实现的任务调度器。
 * 继承自 TaskScheduler，提供了基于 epoll 的 I/O 事件处理的具体实现。
 */
class EpollTaskScheduler : public TaskScheduler
{
public:
    EpollTaskScheduler(int id = 0);
    ~EpollTaskScheduler();
    /**
      * @brief 使用 epoll_ctl 更新 Channel 的监听状态 (ADD, MOD, DEL)。
      * @param channel 要更新的 Channel 对象。
      */
    void UpdateChannel(ChannelPtr channel) override;
    /**
     * @brief 使用 epoll_ctl 移除 Channel 的监听 (DEL)。
     * @param channel 要移除的 Channel 对象。
     */
    void RemoveChannel(ChannelPtr channel) override;
    /**
     * @brief 使用 epoll_wait 等待并处理 I/O 事件。
     * @return bool 指示操作是否成功（或是否有事件处理）。
     */
    bool HandleEvent(int timeout) override;

protected:
    /**
     * @brief 内部辅助函数，用于调用 epoll_ctl 执行具体操作。
     * @param operation EPOLL_CTL_ADD, EPOLL_CTL_MOD, 或 EPOLL_CTL_DEL。
     * @param channel 相关的 Channel 对象。
     */
    void Update(int operation, ChannelPtr& Channel);

private:
    int epoll_fd_ = -1;
    std::mutex mtx_;
    // 存储当前 epoll 实例正在监听的所有 Channel
    // key: 文件描述符 (int)
    // value: 对应的 Channel 对象的智能指针
    std::unordered_map<int, ChannelPtr> channels_;
};



#endif //EPOLLTASKSCHEDULER_H
